Første tester

Jeg bruker trimesh, som er et ganske omfattende meshverktøy i Python. Deretter lager jeg en funksjon som:

  1. Importerer en meshfil (i vårt tilfelle vil det være STL-filer).
  2. Setter en farge på alle polygonene.
  3. Oppretter en scene med meshet. Som standard vises bare overflaten og ikke kantene eller punktene, men det er mulig å legge til i scenen. Andre instillinger som lys og kamera kan også settes, men jeg har foreløpig ikke gjort noe med dette.

Denne funksjonen gir et utgangspunkt for senere justeringer. Hvis vi for eksempel vil framheve hvor avviket er størst, kan vi bruke denne funksjonen. Det hadde også vært interessant (men kanskje vanskelig) å lage en slider for enkel sammenligning av to mesh.

Her er koden til funksjonen:

In [ ]:
import trimesh

def load_mesh_scene(filename, show_edges=False):
    mesh = trimesh.load(filename)
    color = [128, 176, 255, 255]
    mesh.visual.face_colors = color
    geometries = [mesh]
    if show_edges:
        edges = mesh.face_adjacency_edges
        path = trimesh.path.Path3D(**trimesh.path.exchange.misc.edges_to_path(edges, mesh.vertices.copy()))
        geometries.append(path)
    scene = trimesh.Scene(geometries)
    return scene

Videre har jeg brukt Heightmap meshing utility til å konvertere heightmapet Obsidian.png til følgende meshfiler:

Fil Antall polygoner Fil- størrelse Vurdering
Obsidian5m.stl 5 millioner 70.8 MB Brukes som referanse
Obsidian10k.stl 10k 0.52 MB Ingen fine detaljer
Obsidian40k.stl 40k 2 MB Detaljer begynner å komme frem
Obsidian80k.stl 80k 4.1 MB De fleste detaljer er til stede
Obsidian150k.stl 150k 7.6 MB Omtrent som referanse

Vurderingene her er på øyemål og må derfor tas med en stor klype salt. Ideelt sett ønsker jeg å lage noen funksjoner som på en god måte kan visualisere forskjellen mellom referansen og de komprimerte meshfilene.

Dere kan se resultatene under (venstre musknapp for rotasjon, høyre museknapp for translasjon).

In [46]:
mesh1 = load_mesh_scene("Obsidian5m.stl")
mesh1.show()
Out[46]:
In [49]:
mesh1 = load_mesh_scene("Obsidian10k.stl")
mesh1.show()
Out[49]:
In [ ]:

In [42]:
mesh1 = load_mesh_scene("Obsidian40k.stl")
mesh1.show()
Out[42]:
In [43]:
mesh1 = load_mesh_scene("Obsidian80k.stl")
mesh1.show()
Out[43]:
In [47]:
mesh1 = load_mesh_scene("Obsidian150k.stl")
mesh1.show()
Out[47]:
In [ ]: